package main;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;

// @ Cliente
public class CodifMsjaCAP {

	private String str_encoding_scheme = "UTF-8";
	
	// Convierte el string txt en una cadena de bytes utilizando 
	// el esquema "esquema" y lo pone en el dataoutput stream
	
	private void writeString(DataOutputStream out, String txt, String esquema){
		byte[] txt_en_bytes = null;
		try {
			txt_en_bytes = txt.getBytes(esquema);
			out.writeInt(txt_en_bytes.length);
			out.write(txt_en_bytes);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private String readString(DataInputStream in) throws IOException{
		byte[] buf;
		int l = in.readInt();
		
		buf = new byte[l];
		in.readFully(buf);
		
		return new String(buf, str_encoding_scheme);
	}
	
	
	public byte[] alCable(Mensaje_al_CAP msj) throws IOException{
		ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
		DataOutputStream out = new DataOutputStream(byteStream);
		
		out.writeInt(msj.getID());  		// ID msj
		out.writeInt(msj.getIDorigen());	// ID chacra
		writeString(out, msj.getIPorigen().getHostAddress(), str_encoding_scheme); // IP origen
		writeString(out, msj.getCuerpo(), str_encoding_scheme);
		
		// Datos enfermero
		writeString(out, msj.getEnfermero().getNape(), str_encoding_scheme);
		out.writeInt(msj.getEnfermero().getDNI());
				
		// Datos Paciente
		writeString(out, msj.getPaciente().getNape(), str_encoding_scheme);
		out.writeInt(msj.getPaciente().getDNI());
		out.writeInt(msj.getPaciente().getEdad());
		writeString(out, msj.getPaciente().getSexo(), str_encoding_scheme);
		
		out.writeFloat(msj.getPaciente().getTemperatura()); // Temp
		out.writeInt(msj.getPaciente().getPresion_sistolica());   // Sistolica
		out.writeInt(msj.getPaciente().getPresion_distolica());   // Diastolica
		out.writeInt(msj.getPaciente().getFrecuencia_resp());  // Frecuencia Respiratoria
		out.writeInt(msj.getPaciente().getPpm());   // PPM
		out.writeInt(msj.getPaciente().getGlucosa_en_sangre());
		out.writeInt(msj.getPaciente().getOxigeno_en_sangre());
		
		// Electrocardiograma u otros estudios
		int c_muestras = msj.getElectro().cant_muestras(); 
		out.writeInt(c_muestras);
		
		double muestra = 0.0d;
		double tiempo  = 0.0d;
		
		for(int i=0;i<c_muestras;i++){
			muestra = msj.getElectro().da_muestra(i).getMedicion();
			out.writeDouble(muestra);
			tiempo = msj.getElectro().da_muestra(i).getTiempo();
			out.writeDouble(tiempo);
		}
		
		out.flush();
		out.close();
		
		return byteStream.toByteArray();
	}
	
	public Mensaje_al_CAP delCable(byte[] input) throws IOException{
		ByteArrayInputStream bs = new ByteArrayInputStream(input);
		DataInputStream in = new DataInputStream(bs);
		Mensaje_al_CAP msj = new Mensaje_al_CAP();
		
		msj.setID(in.readInt()); 			// ID msj
		msj.setIDorigen(in.readInt());		// ID chacra		
		msj.setIPorigen(InetAddress.getByName(readString(in))); // IP origen
		msj.setCuerpo(readString(in));
		
		// Datos enfermero
		msj.getEnfermero().setNape(readString(in));
		msj.getEnfermero().setDNI(in.readInt());
		
		// Datos Paciente
		msj.getPaciente().setNape(readString(in));
		msj.getPaciente().setDNI(in.readInt());
		msj.getPaciente().setEdad(in.readInt());
		msj.getPaciente().setSexo(readString(in));
		
		msj.getPaciente().setTemperatura(in.readFloat());   // Temp
		msj.getPaciente().setPresion_sistolica(in.readInt()); // Sistolica
		msj.getPaciente().setPresion_distolica(in.readInt()); // Diastolica
		msj.getPaciente().setFrecuencia_resp(in.readInt());
		msj.getPaciente().setPpm(in.readInt());
		msj.getPaciente().setGlucosa_en_sangre(in.readInt());
		msj.getPaciente().setOxigeno_en_sangre(in.readInt());
		
		// Electrocardiograma
		int c_muestras = in.readInt();
		Electrocardiograma e = new Electrocardiograma();
		double muestra = 0.0d;
		double tiempo  = 0.0d;
		
		for(int i=0;i<c_muestras;i++){
			muestra = in.readDouble();
			tiempo  = in.readDouble();
			e.agregar_muestra(new Muestra(muestra, tiempo));			
		}
	
		msj.setElectro(e);		
		
		return msj;
		
	}
	
	// Permite separar mensajes. Inserto primero la long del mensaje 
	// (Framing por longitud de datos)
	public void enmarcar(byte[] msj, DataOutputStream out) throws IOException{
		out.writeInt(msj.length);
		out.write(msj);
	}

	public byte[] desenmarcar(DataInputStream in) throws IOException{
		int len = in.readInt();

		byte[] buf = new byte[len];
		in.readFully(buf);

		return buf;
	}

	
}
